//工具类
#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sstream>
#include "log.hpp"

class Util
{
public:
    // 一般网页文件都是文本的，但是图片、视频、音频文件是二进制的
    // 该函数用于读取path文件中的内容并保存至file_content中
    static bool ReadFile(const std::string &path, std::string *file_content)
    {
        // 获取文件本身大小
        struct stat st;
        int n = stat(path.c_str(), &st);
        if (n < 0)
            return false;
        int size = st.st_size;
        // 调整string空间
        file_content->resize(size); // 是的file_content足够读取整个文件的内容
        // 读取
        int fd = open(path.c_str(), O_RDONLY);
        if (fd < 0)
            return false;
        read(fd, (char *)file_content->c_str(), size); // 将整个path中的内容读取到file_content中
        close(fd);
        logMessage(Info, "read file %s done", path.c_str());
        return true;
    }

    // 从message中获取一行
    static std::string ReadOneLine(std::string &message, std::string sep)
    {
        auto pos = message.find(sep);
        if (pos == std::string::npos)
            return "";
        std::string s = message.substr(0, pos);
        message.erase(0, pos + sep.size()); // 去除message中的该行
        return s;
    }

    // 获取请求行
    static bool ParseRequestLine(const std::string &line, std::string *method, std::string *url, std::string *version)
    {
        std::stringstream ss(line);
        ss >> *method >> *url >> *version;
        return true;
    }
};